home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 145 / Gekkan Dennou Club - 2000.6 Vol. 145 (Japan).7z / Gekkan Dennou Club - 2000.6 Vol. 145 (Japan) (Track 1).bin / tools / sharp / sxwork3.lzh / サンプル実用編 / ペイント / GPPALET.C < prev    next >
Text File  |  1994-03-10  |  10KB  |  301 lines

  1. /******************************************************************************
  2.  *    gppalet.c:    パレット設定ウィンドウ関係のモジュール
  3.  ******************************************************************************
  4.  *    Workroom SX-68K Sample Program Copyright 1994 SHARP
  5.  */
  6. #include <stdio.h>
  7. #include <iocslib.h>
  8. #include <console.h>        /* コンソール系マネージャを利用するときに必要 */
  9. #include <sxgraph.h>        /* グラフ系マネージャを利用するときに必要 */
  10. #include <control.h>        /* コントロールマンを利用するときに必要    */
  11. #include <task.h>        /* タスクマンを利用するときに必要    */
  12. #include "gpaint.h"        /* このプログラム固有のヘッダファイル    */
  13.  
  14. static Rect rcbm = { 16, WS_INSIDE_Y + 76, 16 + 20, WS_INSIDE_Y + 76 + 20 };
  15.  
  16. /******************************************************************************
  17.  *    paletMsLDown():    パレット設定ウィンドウでのマウス左ダウン処理
  18.  ******************************************************************************
  19.  *    引数:    ComVal *pcv    共通変数へのポインタ
  20.  */
  21. void paletMsLDown(ComVal *pcv)
  22. {
  23.     int partCode, cnum, cwork;
  24.     int i = 0, rgbf = 0;
  25.     LPoint lpt;
  26.     Control **ctrlHdl;        /* コントロールハンドル        */
  27.     char str[16];
  28.  
  29.     /* マウスのボタンが押されている間、コントロールの各種処理をシステムに
  30.        任せて、コントロールハンドルとボタンが押された、または離された場所
  31.        のパートコードを取得する */
  32.     partCode = SXCallCtrlM(&pcv->subwinPtr[PALET]->win, &pcv->event, 0, 0, NULL, &ctrlHdl);
  33.  
  34.     GMAPage(G_PAGE0 | G_PAGE1);    /* アクセスページを0と1ページにする */
  35.     /* フォントモードのセット */
  36.     OldFM = GMFontMode(G_PSET);
  37.     /* バックグラウンドカラーは白 */
  38.     OldBC = GMBackColor(G_WHITE);
  39.     /* フォアグラウンドカラーは黒 */
  40.     OldFC = GMForeColor(G_BLACK);
  41.     /* 現在設定されている色のパレット値を取得する */
  42.     cwork = pcv->oldPaletBuf[pcv->paletNo];
  43.  
  44.     switch (partCode) {
  45.     case C_INBTTN:            /* 文字ボタン        */
  46.         if (ctrlHdl == pcv->setBtnHdl) {
  47.             /* [設定]ボタンだったなら */
  48.             for (i = 0; i < 16; i++)
  49.                 pcv->paletBuf[i] = pcv->oldPaletBuf[i];
  50.             pcv->editFlag = TRUE; /* 編集フラグをセットする    */
  51.         } else if (ctrlHdl == pcv->canBtnHdl)
  52.             /* [取消]ボタンだったなら */
  53.             for (i = 0; i < 16; i++)
  54.                 pcv->oldPaletBuf[i] = pcv->paletBuf[i];
  55.         /* 文字ボタンをインアクティブにする */
  56.         CMShine(pcv->setBtnHdl, C_INACTIVE);
  57.         CMShine(pcv->canBtnHdl, C_INACTIVE);
  58.         pcv->disableBtn = TRUE;
  59.         /* 設定値によってコントロールの描画をし直す */
  60.         setPalet(pcv->oldPaletBuf);
  61.         drawPaletCtrl(pcv);
  62.         break;
  63.     case C_INDEC:            /* 数値調整ボタン    */
  64.     case C_ININC:
  65.         /* 増加ボタン、又は減少ボタンだったなら */
  66.         if (ctrlHdl == pcv->RGBBtnHdl[0]) {
  67.             rgbf = 0;
  68.             cwork = cwork & 0x0000f83f;    /* G,Bデータをマスク */
  69.             i = 6;                /* シフト数 = 6    */
  70.         } else if (ctrlHdl == pcv->RGBBtnHdl[1]) {
  71.             rgbf = 1;
  72.             cwork = cwork & 0x000007ff;    /* R,Bデータをマスク */
  73.             i = 11;                /* シフト数 = 11 */
  74.         } else if (ctrlHdl == pcv->RGBBtnHdl[2]) {
  75.             rgbf = 2;
  76.             cwork = cwork & 0x0000ffc1;    /* R,Gデータをマスク */
  77.             i = 1;                /* シフト数 = 1    */
  78.         } else
  79.             break;
  80.         repeatAdjBtn(pcv, &pcv->subwinPtr[PALET]->win, pcv->RGBBtnHdl[rgbf], pcv->RGBSlvHdl[rgbf], partCode, 3);
  81.         /* 新しいパレット値を作成する */
  82.         cnum = CMValueGet(pcv->RGBBtnHdl[rgbf]);
  83.         cwork = cwork | (cnum << i);
  84.         break;
  85.     case C_INTHUMB:            /* スライドボリューム    */
  86.         if (ctrlHdl == pcv->RGBSlvHdl[0]) {    /* R    */
  87.             rgbf = 0;
  88.             cwork = cwork & 0x0000f83f;    /* G,Bデータをマスク */
  89.             i = 6;                /* シフト数 = 6    */
  90.         } else if (ctrlHdl == pcv->RGBSlvHdl[1]) { /* G    */
  91.             rgbf = 1;
  92.             cwork = cwork & 0x000007ff;    /* R,Bデータをマスク */
  93.             i = 11;                /* シフト数 = 11 */
  94.         } else if (ctrlHdl == pcv->RGBSlvHdl[2]) { /* B    */
  95.             rgbf = 2;
  96.             cwork = cwork & 0x0000ffc1;    /* R,Gデータをマスク */
  97.             i = 1;                /* シフト数 = 1    */
  98.         }
  99.         /* R、G、Bの値を取り出す */
  100.         cnum = CMValueGet(pcv->RGBSlvHdl[rgbf]);
  101.         /* 数値調整ボタンのタイトルを設定する */
  102.         sprintf(str, "\x03%3d", cnum);
  103.         CMTitleSet(pcv->RGBBtnHdl[rgbf], (_LASCII)str);
  104.         CMValueSet(pcv->RGBBtnHdl[rgbf], cnum);
  105.         /* 新しいパレット値を作成する */
  106.         cwork = cwork | (cnum << i);
  107.         break;
  108.     default:
  109.         /* コントロールでないとき */
  110.         /* 入力座標をローカル座標系に変換する */
  111.         lpt = GMGlobalToLocal(pcv->event.ev.where.x_y);
  112.         /* "I"のレクタングルを設定 */
  113.         if (GMPtInRect(&rcbm, lpt)) {
  114.             cwork = pcv->oldPaletBuf[pcv->paletNo];
  115.             /* 文字表示位置の設定 */
  116.             GMMove(LONGWORD(16 + 10, WS_INSIDE_Y + 80));
  117.             if ((cwork & 0x00000001) == 0) {
  118.                 GMDrawChar('1');
  119.                 cwork ^= 0x00000001;
  120.             } else {
  121.                 GMDrawChar('0');
  122.                 cwork ^= 0x00000001;
  123.             }
  124.             /* 設定されたパレット値を保存する */
  125.             setPalet(pcv->oldPaletBuf);
  126.         }
  127.         break;
  128.     }
  129.     /* [設定]/[取消]ボタンでなくパレットの値が変わったなら */
  130.     if (partCode != C_INBTTN && pcv->oldPaletBuf[pcv->paletNo] != cwork) {
  131.         if ((*pcv->setBtnHdl)->hilite != 0) {
  132.             /* 文字ボタンをアクティブにする */
  133.             CMShine(pcv->setBtnHdl, C_ACTIVE);
  134.             CMShine(pcv->canBtnHdl, C_ACTIVE);
  135.             pcv->disableBtn = FALSE;
  136.         }
  137.         /* 設定されたパレット値を保存する */
  138.         pcv->oldPaletBuf[pcv->paletNo] = cwork;
  139.         setPalet(pcv->oldPaletBuf);
  140.     }
  141.  
  142.     /* バック/フォアグラウンドカラーを元に戻す */
  143.     GMBackColor(OldBC);
  144.     GMForeColor(OldFC);
  145.     /* フォントモードを元に戻す */
  146.     GMPenMode(OldFM);
  147. }
  148.  
  149. /******************************************************************************
  150.  *    drawPaletWnd():    パレット設定ウィンドウの描画
  151.  ******************************************************************************
  152.  *    引数:    ComVal *pcv    共通変数へのポインタ
  153.  */
  154. void drawPaletWnd(ComVal *pcv)
  155. {
  156.     int i;
  157.     Rect rc;
  158.  
  159.     drawSubwin(pcv, PALET);        /* サブウィンドウを描画する    */
  160.  
  161.     /* パレット設定ウィンドウをテキストタイプでカレントグラフにする */
  162.     setGraph(&pcv->subwinPtr[PALET]->win, G_TXT);
  163.  
  164.     GMAPage(G_PAGE0 | G_PAGE1);    /* アクセスページを0と1ページにする */
  165.     /* フォントモードのセット */
  166.     OldFM = GMFontMode(G_PSET);
  167.     /* バックグラウンドカラーはライトグレー */
  168.     OldBC = GMBackColor(G_LGRAY);
  169.     /* フォアグラウンドカラーは黒 */
  170.     OldFC = GMForeColor(G_BLACK);
  171.     /* 文字表示開始位置の設定 */
  172.     /* "R"を描画 */
  173.     GMShadowStrZ("R", LONGWORD(6, WS_INSIDE_Y +  7));
  174.     /* "G"を描画 */
  175.     GMShadowStrZ("G", LONGWORD(6, WS_INSIDE_Y + 31));
  176.     /* "B"を描画 */
  177.     GMShadowStrZ("B", LONGWORD(6, WS_INSIDE_Y + 55));
  178.     /* "I"を描画 */
  179.     GMShadowStrZ("I", LONGWORD(6, WS_INSIDE_Y + 79));
  180.  
  181.     /* フォントモードを元に戻す */
  182.     GMFontMode(OldFM);
  183.  
  184.     /* 影付きレクタングルを表示する */
  185.     GMBackColor(G_WHITE);
  186.     GMShadowRect(&rcbm);
  187.     GMBackColor(G_LGRAY);
  188.  
  189.     /* レクタングル位置の初期設定をする */
  190.     rc.l.l_t = LONGWORD(92, WS_INSIDE_Y + 4);
  191.     rc.l.r_b = LONGWORD(92 + 68, WS_INSIDE_Y + 4 + 20);
  192.     /* ペンモードをセットする */
  193.     OldPM = GMPenMode(G_PSET);
  194.  
  195.     for (i = 0; i < 3; i++) {
  196.         /* 影付きレクタングル(スライドボリュームの枠)を描く */
  197.         GMShadowRect(&rc);
  198.         /* Y方向だけ24ドットスライドして描画 */
  199.         GMSlideRect(&rc, LONGWORD(0, 24));
  200.     }
  201.     /* バック/フォアグラウンドカラーを元に戻す */
  202.     GMBackColor(OldBC);
  203.     GMForeColor(OldFC);
  204.  
  205.     /* ペンモードを元に戻す */
  206.     GMPenMode(OldPM);
  207.  
  208.     /* コントロールを描画する */
  209.     drawPaletCtrl(pcv);
  210. }
  211.  
  212. /******************************************************************************
  213.  *    drawPaletCtrl():    パレット設定ウィンドウでのコントロールの描画
  214.  ******************************************************************************
  215.  *    引数:    ComVal *pcv    共通変数へのポインタ
  216.  */
  217. void drawPaletCtrl(ComVal *pcv)
  218. {
  219.     int cnum, cwork = 0;
  220.     char str[16];
  221.  
  222.     static Rect rc1 = {
  223.         68, WS_INSIDE_Y + 76, 68 + 20, WS_INSIDE_Y + 76 + 20
  224.     };
  225.     static Rect rc2 = {
  226.         69, WS_INSIDE_Y + 75, 69 + 19, WS_INSIDE_Y + 75 + 19
  227.     };
  228.  
  229.     /* パレット設定ウィンドウをテキストタイプでカレントグラフにする */
  230.     setGraph(&pcv->subwinPtr[PALET]->win, G_TXT);
  231.     GMAPage(G_PAGE0 | G_PAGE1);    /* アクセスページを0と1ページにする */
  232.     /* フォントモードのセット */
  233.     GMPenMode(G_PSET);
  234.     /* フォントモードのセット */
  235.     GMFontMode(G_PSET);
  236.     /* バックグラウンドカラーは白 */
  237.     GMBackColor(G_WHITE);
  238.     /* フォアグラウンドカラーは黒 */
  239.     GMForeColor(G_BLACK);
  240.  
  241.     /* 選択中のパレットデータを取得する */
  242.     cwork = pcv->oldPaletBuf[pcv->paletNo];
  243.     /* 文字表示開始位置の設定 */
  244.     GMMove(LONGWORD(16 + 10, WS_INSIDE_Y + 80));
  245.  
  246.     GMDrawChar(((cwork & 0x00000001) == 0) ? '0' : '1');
  247.  
  248.     /* バックグラウンドカラーはグレー */
  249.     GMBackColor(G_LGRAY);
  250.     /* R(赤)データを設定する */
  251.     cnum = (cwork >> 6) & 0x0000001f;
  252.     CMValueSet(pcv->RGBSlvHdl[0], cnum);
  253.     sprintf(str, "\x03%3d", cnum);
  254.     CMTitleSet(pcv->RGBBtnHdl[0], (_LASCII)str);
  255.     CMValueSet(pcv->RGBBtnHdl[0], cnum);
  256.  
  257.     /* G(緑)データを設定する */
  258.     cnum = (cwork >> 11) & 0x0000001f;
  259.     CMValueSet(pcv->RGBSlvHdl[1], cnum);
  260.     sprintf(str, "\x03%3d", cnum);
  261.     CMTitleSet(pcv->RGBBtnHdl[1], (_LASCII)str);
  262.     CMValueSet(pcv->RGBBtnHdl[1], cnum);
  263.  
  264.     /* B(青)データを設定する */
  265.     cnum = (cwork >> 1) & 0x0000001f;
  266.     CMValueSet(pcv->RGBSlvHdl[2], cnum);
  267.     sprintf(str, "\x03%3d", cnum);
  268.     CMTitleSet(pcv->RGBBtnHdl[2], (_LASCII)str);
  269.     CMValueSet(pcv->RGBBtnHdl[2], cnum);
  270.  
  271.     CMDraw(&pcv->subwinPtr[PALET]->win);
  272.     /* 色確認用のレクタングルを表示 */
  273.     GMAPage(G_ALLPAGE);        /* アクセスページを全ページにする */
  274.     GMBackColor(G_THRU);
  275.     GMShadowRect(&rc1);
  276.     GMBackColor(G_LGRAY);
  277.     /* パレット設定ウィンドウをグラフィックタイプでカレントグラフにする */
  278.     setGraph(&pcv->subwinPtr[PALET]->win, G_GRP);
  279.     /* フォアグラウンドカラーをパレット番号で設定する */
  280.     GMForeColor(pcv->paletNo);
  281.     /* 設定色を描画する */
  282.     GMFillRect(&rc2);
  283.  
  284.     /* パレット設定ウィンドウをテキストタイプでカレントグラフにする */
  285.     setGraph(&pcv->subwinPtr[PALET]->win, G_TXT);
  286.     GMAPage(G_PAGE0 | G_PAGE1);    /* アクセスページを0と1ページにする */
  287. }
  288.  
  289. /******************************************************************************
  290.  *    setPalet():    カラーパレットを16色すべてセットする
  291.  ******************************************************************************
  292.  *    引数:    int *pbuff    パレットデータへのポインタ
  293.  */
  294. void setPalet(int *pbuff)
  295. {
  296.     int i;
  297.  
  298.     for (i = 0; i < 16; i++)
  299.         GPALET(i, pbuff[i]);
  300. }
  301.